/**
 * 
 */
package co.com.sed.model.peers;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import co.com.sed.model.beans.Nivel;
import co.com.sed.model.beans.Rango;
import co.com.sed.model.util.Util;

/**
 * @author Mejia
 *
 */
public class NivelPeer {

			
		private static final String BUSCAR_NIVELES = 
				"SELECT id_nivel, nivel, rango "+
				"FROM nivel "; 
		
		private static final String BUSCAR_NIVELES_POR_RANGO = 
				"SELECT id_nivel, nivel, rango "+
				"FROM nivel "+
				"WHERE rango = &rango"; 
		
		private static final String BUSCAR_NIVEL = 
				"SELECT id_nivel, nivel, rango "+
				"FROM nivel "+
				"WHERE id_nivel = &id_nivel";
	
		private static final String INSERTAR_NIVEL = 
				"INSERT INTO nivel(nivel, rango) VALUES "+
				"('&nivel',&rango)";
		
		private static final String ACTULIZAR_NIVEL = 
				"UPDATE nivel "+
				"SET nivel = &nivel, id_rango = &rango "+
				"WHERE id_nivel = &id_nivel";
		
		private static final String ELIMINAR_NIVEL =
				"DELETE FROM cargo "+
				"WHERE id_nivel = &nivel";
		
		
		/* busca en la base de datos todos los registros de la tabla "nivel"
		* 
		* @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		* 
		* @return					lista de niveles
		* @see         				Ninel, Statement
		*/
		public static ArrayList<Nivel> buscarNiveles(Statement stmt) {
			ArrayList<Nivel> niveles = new ArrayList<Nivel>();

			String sql = BUSCAR_NIVELES;

			ResultSet rs;
			try {
				rs = stmt.executeQuery(sql);
				try {
					while (rs.next()) {
						Nivel niv = new Nivel();
						
						niv.setIdNivel(rs.getInt("id_nivel"));
						niv.setNivel(rs.getString("nivel"));
						niv.setRango(new Rango(rs.getInt("rango")));
												
						niveles.add(niv);
					}
				} finally {
					rs.close();
				}
			} catch (SQLException e) {
				Util.print("No es posible consultar la base de datos:"
						+ e.getMessage());
				e.printStackTrace();
			}

			return niveles;
		}
				
		
		/** busca en la base de datos todos los registros de la tabla "nivel" que pertenescan a un rango
		* 
		* @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		* 
		* @return					lista de niveles
		* @see         				Nivel, Statement
		*/
		public static ArrayList<Nivel> buscarNivelesPorRango(Statement stmt, int idRango) {
			ArrayList<Nivel> niveles = new ArrayList<Nivel>();

			String sql = BUSCAR_NIVELES_POR_RANGO;

			// se setean los "parametros"
			sql = sql.replaceAll("&rango", "" + idRango);
			
			ResultSet rs;
			try {
				rs = stmt.executeQuery(sql);
				try {
					while (rs.next()) {
						Nivel niv = new Nivel();
						
						niv.setIdNivel(rs.getInt("id_nivel"));
						niv.setNivel(rs.getString("nivel"));
						niv.setRango(new Rango(rs.getInt("rango")));
						//niv.setRango(new Rango(rs.getString("descripcion")));
												
						niveles.add(niv);
					}
				} finally {
					rs.close();
				}
			} catch (SQLException e) {
				Util.print("No es posible consultar la base de datos:"
						+ e.getMessage());
				e.printStackTrace();
			}

			return niveles;
		}
		
		
		/** busca en la base de datos un registro de la tabla "Nivel"
		* 
		* @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		* @param cargo				id de la Cargo que se desea cosultar
		* 
		* @return					nivel buscado
		* @see         				Nivel, Statement
		*/
		public static Nivel buscarNivel(Statement stmt, int idNivel) {
			Nivel niv = new Nivel();

			String sql = BUSCAR_NIVEL;
			
						
			// se setean los "parametros"
			sql = sql.replaceAll("&id_nivel", "" + idNivel);
			
			ResultSet rs;
			try {
				rs = stmt.executeQuery(sql);
				try {
					if (rs.next()) {
						niv.setIdNivel(rs.getInt("id_nivel"));
						niv.setNivel(rs.getString("nivel"));
						niv.setRango(new Rango(rs.getInt("rango")));
												
					}
				} finally {
					rs.close();
				}
			} catch (SQLException e) {
				Util.print("No es posible consultar la base de datos:" + e.getMessage());
				e.printStackTrace();
			}

			return niv;
		}
		
		
		/** Inserta un Tipo de nivel en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param Nivel				cargo que se va a insertar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al insertar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
		public static int insertarNivel(Statement stmt, Nivel nivel) throws SQLException {
			int idNuevaNivel = -1;
			ResultSet rs = null;
			
			try {
				String sql = INSERTAR_NIVEL;
				 //se setean los "parametros": &id_calificacion, &cualitativa, &cuantitativa, &descripcion 
				sql = sql.replaceAll("&nivel", "" + nivel.getNivel())
						 .replaceAll("&rango", "" + nivel.getRango().getIdRango());
						
				stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);
				
				rs = stmt.getGeneratedKeys();
				if (rs.next()) {
					idNuevaNivel = rs.getInt("id_nivel");
					Util.print("nuevo registro: " + idNuevaNivel);
				}
			} finally {
				rs.close();
			}
			
			return idNuevaNivel;
		}

	
		
		/** Actualiza un Nivel en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param cargo			cargo que se va a actualizar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al actualizar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
		public static void actualizarNivel(Statement stmt, Nivel nivel) throws SQLException {
			String sql = ACTULIZAR_NIVEL;
			// se setean los "parametros": &id_nivel, &nivel,&rango
			sql = sql.replaceAll("&id_nivel", ""+ nivel.getIdNivel())
					 .replaceAll("&nivel", ""+nivel.getNivel())
					 .replaceAll("&rango", ""+nivel.getRango().getIdRango());
			
			stmt.executeUpdate(sql);
		}
		
		/** Elimina un Nivel en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param Nivel				Nivel que se va a eliminar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al eliminar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
		public static void eliminarNivel(Statement stmt, Nivel nivel) throws SQLException {
			String sql = ELIMINAR_NIVEL;
			// se setean los "parametros": &id_nivel
			sql = sql.replaceAll("&id_nivel", "" + nivel.getIdNivel());

			stmt.executeUpdate(sql);
		}
	
}
